import axios from 'axios'
import { ElMessage, ElLoading } from 'element-plus'

// 创建axios实例
const service = axios.create({
    baseURL: import.meta.env.VITE_APP_BASE_API, // 从环境变量获取基础URL
    timeout: 5000 // 请求超时时间
})

// 加载动画实例
let loadingInstance = null

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 显示加载动画
        loadingInstance = ElLoading.service({
            lock: true,
            text: '加载中...',
            background: 'rgba(0, 0, 0, 0.1)'
        })

        // 在请求头中添加token（如果存在）
        const token = localStorage.getItem('token')
        if (token) {
            config.headers['Authorization'] = `Bearer ${token}`
        }
        return config
    },
    error => {
        // 关闭加载动画
        if (loadingInstance) loadingInstance.close()
        // 处理请求错误
        ElMessage.error('请求错误: ' + (error.message || '未知错误'))
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    response => {
        // 关闭加载动画
        if (loadingInstance) loadingInstance.close()

        const res = response.data

        // 如果后端返回错误码，统一处理
        if (res.code !== 200) {
            ElMessage.error(res.msg || '操作失败')
            return Promise.reject(new Error(res.msg || 'Error'))
        } else {
            return res
        }
    },
    error => {
        // 关闭加载动画
        if (loadingInstance) loadingInstance.close()

        // 处理响应错误
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    ElMessage.error('未授权，请重新登录')
                    // 跳转到登录页
                    window.location.href = '/login'
                    break
                case 403:
                    ElMessage.error('没有权限执行该操作')
                    break
                case 404:
                    ElMessage.error('请求的资源不存在')
                    break
                case 500:
                    ElMessage.error('服务器内部错误')
                    break
                default:
                    ElMessage.error(`请求失败: ${error.response.status}`)
            }
        } else {
            ElMessage.error('网络错误，请检查网络连接')
        }
        return Promise.reject(error)
    }
)

export default service
